/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.sgsmcan.Utils;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author Luis Alonso Ballena Garcia
 */
public class FiltroHibernate {

    public static final Integer TYPE_STRING = 1; 
    public static final Integer TYPE_INTEGER = 2;
    public static final Integer TYPE_BOOLEAN = 3;
    public static final Integer TYPE_RANGE_DATE = 5;
    
    List<ParametroFiltro> filtros = new ArrayList<ParametroFiltro>();
    private DetachedCriteria criteria;

    public FiltroHibernate(DetachedCriteria criteria) {
        this.criteria = criteria;
    }

    public DetachedCriteria executeFiltro() {
        ensamblarParametros();
        return criteria;
    }

    public void addLikeNullParametro(String valor , String alias) {
        if(valor == null || valor.toString().length() == 0){
            return;
        }
        ParametroFiltro parametroFiltro = new ParametroFiltro();
        parametroFiltro.setTipoDato(TYPE_STRING);
        parametroFiltro.setValor(valor);
        parametroFiltro.setAlias(alias);
        filtros.add(parametroFiltro);
    }
    
    public void addComboParametro(Integer valor , String alias){
        if(valor == 0){
            return;
        }
        ParametroFiltro parametroFiltro = new ParametroFiltro();
        parametroFiltro.setTipoDato(TYPE_INTEGER);
        parametroFiltro.setValor(valor);
        parametroFiltro.setAlias(alias);
        filtros.add(parametroFiltro);
    }
    
    public void addRangeFecha(Date dateMin ,Date dateMax ,String alias){
        if(dateMin == null || dateMax == null){
            return;
        }
        if(Utilitario.esFechaMayor(dateMin, dateMax)){
            Utilitario.enviarMensajeGlobalError("La fecha inicial es mayor que la fecha final");
            return;
        }
        ParametroFiltro parametroFiltro = new ParametroFiltro();
        parametroFiltro.setTipoDato(TYPE_RANGE_DATE);
        parametroFiltro.setValor(dateMin);
        parametroFiltro.setValor2(dateMax);
        parametroFiltro.setAlias(alias);
        filtros.add(parametroFiltro);
    }

    private void ensamblarParametros() {
        for (ParametroFiltro params : filtros) {
            ensamblarParametro(params);
        }
    }

    private void ensamblarParametro(ParametroFiltro params) {
        switch (params.getTipoDato()) {
            case 1:
                    criteria.add(Restrictions.like(params.getAlias(),String.valueOf(params.getValor())+"%"));
                break;
            case 2:
                    Integer dato = (Integer) params.getValor();
                    criteria.add(Restrictions.eq(params.getAlias(),dato));
                break;
                
            case 5:
                    Date dateMin = (Date) params.getValor();
                    Date dateMax = (Date) params.getValor2();
                    criteria.add(Restrictions.ge(params.getAlias(),dateMin)).add(Restrictions.le(params.getAlias(),dateMax));
                break;
        }
    }

    
    
    private class ParametroFiltro {

        Integer tipoDato;
        Object valor;
        Object valor2;
        String alias;

        public ParametroFiltro() {
        }

        public Integer getTipoDato() {
            return tipoDato;
        }

        public void setTipoDato(Integer tipoDato) {
            this.tipoDato = tipoDato;
        }

        public Object getValor() {
            return valor;
        }

        public void setValor(Object valor) {
            this.valor = valor;
        }
        public String getAlias() {
            return alias;
        }

        public void setAlias(String alias) {
            this.alias = alias;
        }

        public Object getValor2() {
            return valor2;
        }

        public void setValor2(Object valor2) {
            this.valor2 = valor2;
        }

    }
}
